#include "TabTirs.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>


void initTabTirs (TabTirs* ptab_ptirs)
{
      assert (ptab_ptirs!=NULL);
      ptab_ptirs->ptab_tirs=NULL;
      ptab_ptirs->nbre_tirs=0;
}

TabTirs* creerTabTirs ()
{
     TabTirs* ptab_ptirs= (TabTirs*) malloc(sizeof(TabTirs));
     initTabTirs(ptab_ptirs);
      return ptab_ptirs;
}

void libereTabTirs (TabTirs* ptab_ptirs)
{
	assert (ptab_ptirs!=NULL);
	while (ptab_ptirs->nbre_tirs > 0)
	{
		free (ptab_ptirs->ptab_tirs[ptab_ptirs->nbre_tirs-1]);
		ptab_ptirs->ptab_tirs[ptab_ptirs->nbre_tirs-1] = NULL;
		ptab_ptirs->nbre_tirs--;
	}
	ptab_ptirs->nbre_tirs=0;
}

void detruireTabTirs (TabTirs** pptab_ptirs)
{
      assert (pptab_ptirs!=NULL && *pptab_ptirs!=NULL);
      libereTabTirs (*pptab_ptirs);
      free (*pptab_ptirs);
      *pptab_ptirs=NULL;
}

const int getNbreTirsTabTirs (const TabTirs* ptab_ptirs)
{
	assert (ptab_ptirs != NULL);
	return ptab_ptirs->nbre_tirs;
}

void setNbreTirsTabTirs (TabTirs* ptab_ptirs, const int nbre)
{
	assert (ptab_ptirs != NULL);
	assert (nbre >= 0);
        ptab_ptirs->nbre_tirs = nbre;
}

Tir** get_ptab_tirsTabTirs (const TabTirs* ptab_ptirs)
{
	assert (ptab_ptirs != NULL);
	return ptab_ptirs->ptab_tirs;
}

Tir* getTirTabTirs (const TabTirs* ptab_ptirs, const int i_tir)
{
	assert (ptab_ptirs != NULL);
	assert (i_tir >= 0);
	return ptab_ptirs->ptab_tirs[i_tir];
}

void setTirTabTirs (TabTirs* ptab_ptirs, const int i_tir, Tir* nouveau_tir)
{
	assert (ptab_ptirs != NULL && i_tir >= 0);
	ptab_ptirs->ptab_tirs[i_tir] = nouveau_tir;
}
  
void ajouterTir (TabTirs* ptab_ptirs, Tir* ptir)
{ 
	assert (ptab_ptirs != NULL && ptir != NULL);
	if (ptir->ptraj_tir->ppoint1->posY_point != ptir->ptraj_tir->ppoint2->posY_point)
	{
		if ( get_ptab_tirsTabTirs(ptab_ptirs) == NULL)
		{
			ptab_ptirs->ptab_tirs = (Tir**)malloc(sizeof(ptir));
			setTirTabTirs(ptab_ptirs, 0, ptir);
			setNbreTirsTabTirs(ptab_ptirs, 1);
		}
	else
		{
	   
		TabTirs* ptab_ptirs_temp=creerTabTirs ();
	   
		ptab_ptirs_temp->ptab_tirs = (Tir**)malloc(sizeof(ptir)*(getNbreTirsTabTirs(ptab_ptirs)+1));
		int i;
		for (i=0;i<getNbreTirsTabTirs(ptab_ptirs);i++)
			ptab_ptirs_temp->ptab_tirs[i]=ptab_ptirs->ptab_tirs[i];
		ptab_ptirs_temp->ptab_tirs[i]=ptir;
		ptab_ptirs->nbre_tirs++;
		free (ptab_ptirs->ptab_tirs);
		ptab_ptirs->ptab_tirs=ptab_ptirs_temp->ptab_tirs;
		}
	      
	}
}

/*void supprimerTir (TabTirs* ptab_ptirs, Tir* ptir)
{
	int j = 0;
	if (ptab_ptirs->nbre_tirs>1)
	{
		TabTirs* ptab_ptirs_temp=creerTabTirs ();
		ptab_ptirs_temp->ptab_tirs=(Tir**)malloc(sizeof(ptir)*(ptab_ptirs->nbre_tirs-1));
		int i;
		for (i=0;i<ptab_ptirs->nbre_tirs;i++)
		{
			if (ptab_ptirs->ptab_tirs[i] != ptir)
			{
				ptab_ptirs_temp->ptab_tirs[j]=ptab_ptirs->ptab_tirs[i];
				j++;
			}
		}   
		ptab_ptirs->nbre_tirs--;
		libereTabTirs(ptab_ptirs);
		ptab_ptirs->ptab_tirs=ptab_ptirs_temp->ptab_tirs;
	  }
	  else if (ptab_ptirs->nbre_tirs==1)
	  {
	      detruireTir(&(ptab_ptirs->ptab_tirs[0]));
	      ptab_ptirs->nbre_tirs=0;
	  }

}
*/
void supprimerTir (TabTirs* ptab_ptirs, Tir* ptir)
{
	int i;
	if (ptab_ptirs->nbre_tirs>1)
	{
		for (i=0;i<ptab_ptirs->nbre_tirs;i++)
		{
			if (ptab_ptirs->ptab_tirs[i]==ptir)
			{
				ptab_ptirs->ptab_tirs[i]=ptab_ptirs->ptab_tirs[ptab_ptirs->nbre_tirs-1];
				//ptab_ptirs->ptab_tirs[ptab_ptirs->nbre_tirs-1]=NULL;
				ptab_ptirs->nbre_tirs--;
			}
		}
	}
	else if (ptab_ptirs->nbre_tirs==1)
		if (ptab_ptirs->ptab_tirs[0]==ptir)
			ptab_ptirs->nbre_tirs=0;
	      
}
// void supprimerTir (TabTirs* ptab_ptirs, Tir* ptir)
// {
// 	int i;
// 	if (ptab_ptirs->nbre_tirs>1)
// 	{
// 		for (i=0;i<ptab_ptirs->nbre_tirs;i++)
// 		{
// 			if (ptab_ptirs->ptab_tirs[i]==ptir)
// 			{
// 				ptab_ptirs->ptab_tirs[i]=ptab_ptirs->ptab_tirs[ptab_ptirs->nbre_tirs-1];
// 				ptab_ptirs->nbre_tirs--;
// 			}
// 		}
// 	}
// 	else if (ptab_ptirs->nbre_tirs==1)
// 		if (ptab_ptirs->ptab_tirs[0]==ptir)
// 			ptab_ptirs->nbre_tirs=0;
// 	      
// 
// }

/** @brief Cette procedure permet de tester toutes les fonctions du module
 */
void testRegressionTabTirs ()
{	
	printf("Passons au test de regression du module TabTirs\n\n");
     	printf("Creation point 1\n");
	Point* ppt1=creerPoint(2, 4);
	Point* ppt2=creerPoint(8, 6);
      	
	printf("Passons a la creation d'une trajectoire\n\n");
      	Trajectoire* ptraj=creerTrajectoire (ppt1, ppt2, 2.5);
      
	printf("Passons a la creation des tirs\n\n");
      	Tir* ptir=creerTir (1, 2, 3, 4, ptraj, 0);
      	Tir* ptir2=creerTir (11, 22, 33, 44, ptraj, 1);
	Tir* ptir3=creerTir (111, 222, 333, 444, ptraj, 0);
	Tir* ptir4=creerTir (1111, 2222, 3333, 4444, ptraj, 1);
      
	printf("Passons a la creation du tableau  de tirs\n\n");
      	TabTirs* ptableau_tir=creerTabTirs ();
      	printf("le tableau de tirs a pour adresse %p et le tir %p et le nbre %d\n\n"
      	,ptableau_tir,ptir,ptableau_tir->nbre_tirs);
      	printf("le nbre de tirs est %d\n\n",ptableau_tir->nbre_tirs);
	
	ajouterTir (ptableau_tir, ptir);
	printf("l'ennemi du tabeau a pour valeurs 1,2,3,4 et ami est a 0 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[0]->tailleX_tir,
	     ptableau_tir->ptab_tirs[0]->tailleY_tir,
	     ptableau_tir->ptab_tirs[0]->posX_tir,
	     ptableau_tir->ptab_tirs[0]->posY_tir,
	     ptableau_tir->ptab_tirs[0]->tir_ami);
	printf("le nbre de tirs est %d et les pointeurs sont %p t %p\n\n"
	,ptableau_tir->nbre_tirs, ptableau_tir->ptab_tirs[0]->ptraj_tir, ptir->ptraj_tir);
	
	ajouterTir (ptableau_tir, ptir2);
	printf("l'ennemi du tabeau a pour valeurs 11,22,33,44 et ami est a 1 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[1]->tailleX_tir,
	     ptableau_tir->ptab_tirs[1]->tailleY_tir,
	     ptableau_tir->ptab_tirs[1]->posX_tir,
	     ptableau_tir->ptab_tirs[1]->posY_tir,
	     ptableau_tir->ptab_tirs[1]->tir_ami);
	printf("le nbre de tirs est %d et les pointeurs sont %p t %p\n\n"
	,ptableau_tir->nbre_tirs, ptableau_tir->ptab_tirs[1]->ptraj_tir, ptir2->ptraj_tir);
	
	ajouterTir (ptableau_tir, ptir3);
	printf("l'ennemi du tabeau a pour valeurs 111,222,333,444 et ami est a 0 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[2]->tailleX_tir,
	     ptableau_tir->ptab_tirs[2]->tailleY_tir,
	     ptableau_tir->ptab_tirs[2]->posX_tir,
	     ptableau_tir->ptab_tirs[2]->posY_tir,
	     ptableau_tir->ptab_tirs[2]->tir_ami);
	printf("le nbre de tirs est %d et les pointeurs sont %p t %p\n\n"
	,ptableau_tir->nbre_tirs, ptableau_tir->ptab_tirs[2]->ptraj_tir, ptir3->ptraj_tir);
	
	ajouterTir (ptableau_tir, ptir4);
	printf("l'ennemi du tabeau a pour valeurs 1111,2222,3333,4444 et ami est a 1 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[3]->tailleX_tir,
	     ptableau_tir->ptab_tirs[3]->tailleY_tir,
	     ptableau_tir->ptab_tirs[3]->posX_tir,
	     ptableau_tir->ptab_tirs[3]->posY_tir,
	     ptableau_tir->ptab_tirs[3]->tir_ami);
	printf("le nbre de tirs est %d\n\n",ptableau_tir->nbre_tirs);
	
	supprimerTir(ptableau_tir,ptableau_tir->ptab_tirs[3]);
	printf("le nbre de tirs est %d\n\n",ptableau_tir->nbre_tirs);
	
	printf("l'ennemi du tabeau a pour valeurs 1111,2222,3333,4444 et ami est a 0 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[2]->tailleX_tir,
	     ptableau_tir->ptab_tirs[2]->tailleY_tir,
	     ptableau_tir->ptab_tirs[2]->posX_tir,
	     ptableau_tir->ptab_tirs[2]->posY_tir,
	     ptableau_tir->ptab_tirs[2]->tir_ami);
	
	supprimerTir(ptableau_tir,ptableau_tir->ptab_tirs[2]);
	printf("le nbre de tirs est %d\n\n",ptableau_tir->nbre_tirs);
	printf("l'ennemi du tabeau a pour valeurs 11,22,33,44 et ami est a 1 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[1]->tailleX_tir,
	     ptableau_tir->ptab_tirs[1]->tailleY_tir,
	     ptableau_tir->ptab_tirs[1]->posX_tir,
	     ptableau_tir->ptab_tirs[1]->posY_tir,
	     ptableau_tir->ptab_tirs[1]->tir_ami);

	supprimerTir(ptableau_tir,ptableau_tir->ptab_tirs[1]);
	printf("le nbre de tirs est %d\n\n",ptableau_tir->nbre_tirs);
	printf("l'ennemi du tabeau a pour valeurs 11,22,33,44 et ami est a 1 verifions %f, %f et %f et %f et %d\n\n",
	     ptableau_tir->ptab_tirs[0]->tailleX_tir,
	     ptableau_tir->ptab_tirs[0]->tailleY_tir,
	     ptableau_tir->ptab_tirs[0]->posX_tir,
	     ptableau_tir->ptab_tirs[0]->posY_tir,
	     ptableau_tir->ptab_tirs[0]->tir_ami);

	
	supprimerTir(ptableau_tir,ptableau_tir->ptab_tirs[0]);
	printf("le nbre de tirs est %d\n\n",ptableau_tir->nbre_tirs);
	
	printf("Fin du test de regression du module TabTirs\n\n");  
}
